home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
msdos
/
3dflt86
/
3dflt86.asm
next >
Wrap
Assembly Source File
|
1991-10-18
|
19KB
|
1,293 lines
INCLUDE YAM3D86.LIB
ASSUME DS:DATA,CS:CODE
LINEXE MACRO X0,Y0,X1,Y1
MOV AX,X0
MOV BX,Y0
MOV CX,X1
MOV DX,Y1
$LINE
ENDM
BOX MACRO X0,Y0,X1,Y1
LINEXE X0,Y0,X1,Y0
LINEXE X0,Y0,X0,Y1
LINEXE X1,Y0,X1,Y1
LINEXE X0,Y1,X1,Y1
ENDM
;
;**ABOUT CONDITION CODE
;
TAKEOFF EQU 0000000000000001B
LANDING EQU 0000000000000010B
ABOUT EQU 1000000000000000B
BADPICH EQU 0100000000000000B
LOWSPD EQU 0010000000000000B
HISPD EQU 0001000000000000B
COUT EQU 0000100000000000B
;
;
;
DSPD EQU 2
DPOW EQU 1
TOSPD EQU 60
TDSPD EQU 30
LBOUND EQU 5
LOWEST EQU 3
HIGHEST EQU 2000
SLOWEST EQU 20
FASTEST EQU 118
DWNSPD EQU 35
RADSPC EQU 15
ELVSPC EQU 2
AILSPC EQU 3
PORTX0 EQU -15
PORTZ0 EQU -750
PORTX1 EQU 15
PORTZ1 EQU 750
;
SCRNX0 EQU 150
SCRNY0 EQU 10
SCRNX1 EQU 489
SCRNY1 EQU SCRNY0+250
CENTX EQU (SCRNX0+SCRNX1)/2
CENTY EQU (SCRNY0+SCRNY1)/2
;
RDX0 EQU 90
RDY0 EQU SCRNY1+5
RDX1 EQU RDX0+120
RDY1 EQU RDY0+120
;
POWMAX EQU 59
POWX0 EQU RDX1+10
POWY0 EQU RDY0
POWX1 EQU POWX0+20
POWY1 EQU POWY0+(POWMAX*2)+2
;
POSTX0 EQU 429
POSTY0 EQU RDY0
POSTX1 EQU POSTX0+120
POSTY1 EQU POSTY0+120
POSTCX EQU (POSTX0+POSTX1)/2
POSTCY EQU (POSTY0+POSTY1)/2
;
HIGHTX EQU RDX0+25
HIGHTY0 EQU SCRNY0
HIGHTY1 EQU SCRNY1
HIGHTST EQU 5
;
ILSH_X EQU CENTX
ILSH_Y EQU SCRNY1+20
;
DIRCX EQU CENTX
DIRCY EQU ILSH_Y+70
DIRR EQU 40
;
SPDMAX EQU FASTEST
SPDX0 EQU POSTX0-30
SPDY0 EQU POSTY0
SPDX1 EQU SPDX0+20
SPDY1 EQU SPDY0+SPDMAX+2
;
DATA SEGMENT PUBLIC
INCLUDE EARTH.ASM
PROGRAM DB "1990 山川 総司作"
;
MX DW 0
MY DW 500
MZ DW -4000
MPICH DW 0
MBANK DW 0
MHEAD DW 0
MSPEED DW 0
MPOWER DW 0
MFUEL DW 0
CCODE DW 0
PCTR DW 0
;
POSTSX0 DW 0
POSTSY0 DW 0
POSTSX1 DW 0
POSTSY1 DW 0
HIGHTS DW 0
POWSTK DW 0
ILS_HS DW 0
DIRSX DW 0
DIRSY DW 0
SPDS DW 0
;
Y3WORK DB 512 DUP(?)
DRWBUF DB 4096 DUP(?)
ERSBUF DB 4096 DUP(?)
;
MES_LS DB "失速しました。"
SIZ_LS EQU $-MES_LS
MES_HS DB "機の耐久速度をオーバーしました。"
SIZ_HS EQU $-MES_HS
MES_CO DB "コースアウトしました。"
SIZ_CO EQU $-MES_CO
MES_BP DB "機首から地面に突っ込みました。"
SIZ_BP EQU $-MES_BP
MES_SF DB "COMPLETE!"
SIZ_SF EQU $-MES_SF
MES_HR DB "Hit RETURN(V1.0)"
SIZ_HR EQU $-MES_HR
MES_YM DB "S.Yamakawa Presents"
SIZ_YM EQU $-MES_YM
;
DATA ENDS
;
;
CODE SEGMENT PUBLIC
;
CLIPF PROC
;
; DS:[DI] +2 +4 +6 +8 +10 +12 +14 +16
; X1 Y1 X2 Y2 -- CPX1 CPY1 CPX2 CPY2
MOV AX,[DI+10]
CMP [DI ],AX
JGE CPF_0
CMP [DI+4],AX
JGE CPF_0
JMP FAR PTR CPF_OUT
;
CPF_0: MOV AX,[DI+14]
CMP [DI ],AX
JLE CPF_1
CMP [DI+4],AX
JLE CPF_1
JMP FAR PTR CPF_OUT
;
CPF_1: MOV AX,[DI+12]
CMP [DI+2],AX
JGE CPF_2
CMP [DI+6],AX
JGE CPF_2
JMP FAR PTR CPF_OUT
;
CPF_2: MOV AX,[DI+16]
CMP [DI+2],AX
JLE CPF_3
CMP [DI+6],AX
JLE CPF_3
JMP FAR PTR CPF_OUT
;
; 完全に画面外ではない
;
;
; X1<CPX1?
CPF_3: MOV BX,[DI+10]
CMP [DI ],BX
JGE CP_X21
;CLIP X1=CPX1
MOV [DI+8],BX
$CLIPX
MOV [DI ],BX
MOV [DI+2],AX
JMP [CP_X21]
;
; X2<CPX1?
CP_X21: MOV BX,[DI+10]
CMP [DI+4],BX
JGE CP_X12
;CLIP X2=CPX1
MOV [DI+8],BX
$CLIPX
MOV [DI+4],BX
MOV [DI+6],AX
;
; X1>CPX2?
CP_X12: MOV BX,[DI+14]
CMP [DI ],BX
JLE CP_X22
;CLIP X1=CPX2
MOV [DI+8],BX
$CLIPX
MOV [DI ],BX
MOV [DI+2],AX
JMP [CP_Y11]
;
; X2>CPX2?
CP_X22: MOV BX,[DI+14]
CMP [DI+4],BX
JLE CP_Y11
MOV [DI+8],BX
$CLIPX
MOV [DI+4],BX
MOV [DI+6],AX
;
; Y1<CPY1?
CP_Y11: MOV BX,[DI+12]
CMP [DI+2],BX
JGE CP_Y21
MOV [DI+8],BX
$CLIPY
MOV [DI ],AX
MOV [DI+2],BX
JMP [CP_Y22]
;
; Y2<CPY1?
CP_Y21: MOV BX,[DI+12]
CMP [DI+6],BX
JGE CP_Y12
MOV [DI+8],BX
$CLIPY
MOV [DI+4],AX
MOV [DI+6],BX
;
; Y1>CPY2?
CP_Y12: MOV BX,[DI+16]
CMP [DI+2],BX
JLE CP_Y22
MOV [DI+8],BX
$CLIPY
MOV [DI ],AX
MOV [DI+2],BX
JMP [CLP_EX]
;
; Y2>CPY2?
CP_Y22: MOV BX,[DI+16]
CMP [DI+6],BX
JLE CLP_EX
MOV [DI+8],BX
$CLIPY
MOV [DI+4],AX
MOV [DI+6],BX
;
; LAST CHECK
CLP_EX: MOV AX,[DI+10]
CMP [DI ],AX
JL CPF_OUT
CMP [DI+4],AX
JL CPF_OUT
MOV AX,[DI+14]
CMP [DI ],AX
JG CPF_OUT
CMP [DI+4],AX
JG CPF_OUT
;
MOV AX,[DI+12]
CMP [DI+2],AX
JL CPF_OUT
CMP [DI+6],AX
JL CPF_OUT
MOV AX,[DI+16]
CMP [DI+2],AX
JG CPF_OUT
CMP [DI+6],AX
JG CPF_OUT
RET
;
CPF_OUT:MOV AX,0
MOV [DI ],AX
MOV [DI+2],AX
MOV [DI+4],AX
MOV [DI+6],AX
RET
CLIPF ENDP
;
;
;
MAKEDSP PROC
MOV DI,OFFSET Y3WORK
$PALET 0,0
$PALET 1,9
$PALET 2,10
$PALET 3,11
$PALET 4,12
$PALET 5,13
$PALET 6,14
$PALET 7,15
$PALET 8,0
$PALET 9,9
$PALET 10,10
$PALET 11,11
$PALET 12,12
$PALET 13,13
$PALET 14,14
$PALET 15,15
;
MOV AL,7
$GCOLOR
$PSET
BOX SCRNX0,SCRNY0,SCRNX1,SCRNY1
BOX RDX0,RDY0,RDX1,RDY1
BOX POWX0,POWY0,POWX1,POWY1
BOX POSTX0,POSTY0,POSTX1,POSTY1
BOX SPDX0,SPDY0,SPDX1,SPDY1
LINEXE SPDX0-4,SPDY1-SLOWEST-3,SPDX0 ,SPDY1-SLOWEST-3
LINEXE SPDX1 ,SPDY1-SLOWEST-3,SPDX1+4,SPDY1-SLOWEST-3
;
MOV BX,HIGHTY1
MOV DX,HIGHTY1
HIGHTL: MOV AX,HIGHTX
MOV CX,HIGHTX+9
PUSH BX
$LINE
POP BX
MOV DX,BX
;
MOV AX,HIGHTX+20
MOV CX,HIGHTX+29
PUSH BX
$LINE
POP BX
MOV DX,BX
SUB BX,HIGHTST*5
SUB DX,HIGHTST*5
CMP DX,HIGHTY0
JGE HIGHTL
;
MOV BX,HIGHTY1
MOV DX,HIGHTY1
HIGHT2: MOV AX,HIGHTX
MOV CX,HIGHTX+4
PUSH BX
$LINE
POP BX
MOV DX,BX
;
MOV AX,HIGHTX+25
MOV CX,HIGHTX+29
PUSH BX
$LINE
POP BX
MOV DX,BX
SUB BX,HIGHTST
SUB DX,HIGHTST
CMP DX,HIGHTY0
JGE HIGHT2
;
;ILS_HORIZONTAL
LINEXE ILSH_X ,ILSH_Y,ILSH_X ,ILSH_Y+9
LINEXE ILSH_X+PORTX0*2 ,ILSH_Y,ILSH_X+PORTX0*2,ILSH_Y+4
LINEXE ILSH_X+PORTX1*2 ,ILSH_Y,ILSH_X+PORTX1*2,ILSH_Y+4
BOX ILSH_X+PORTX0*4-5,ILSH_Y,ILSH_X+PORTX0*4,ILSH_Y+9
BOX ILSH_X+PORTX1*4+5,ILSH_Y,ILSH_X+PORTX1*4,ILSH_Y+9
;
MOV BX,0
DIRL: MOV AX,DIRR
$COS
MOV CX,AX
MOV AX,DIRR
$SIN
MOV DX,AX
PUSH BX
ADD CX,DIRCX
ADD DX,DIRCY
$POINT
POP BX
INC BX
CMP BX,1024
JNE DIRL
;
RET
MAKEDSP ENDP
;
;
;
DRAWEXE PROC
MOV SI,OFFSET EARTH
MOV DI,OFFSET DRWBUF
$MKFRM 4000H+32*3+31
MOV DI,OFFSET ERSBUF
$MKFRM 4000H+32*3+31
;
MOV DI,OFFSET Y3WORK
$PSET
;
MOV AX,1
PUSH AX
DEX_0: MOV DI,OFFSET Y3WORK
;
MOV AX,[MHEAD]
NEG AX
MOV [DI+6],AX
MOV AX,[MPICH]
NEG AX
MOV [DI+8],AX
MOV AX,[MBANK]
NEG AX
MOV [DI+10],AX
;
DEX_1: MOV DI,OFFSET Y3WORK
MOV AX,[SI]
SUB AX,[MX]
MOV [DI],AX
;
MOV AX,[MY]
NEG AX
MOV [DI+2],AX
;
MOV AX,[SI+2]
SUB AX,[MZ]
MOV [DI+4],AX
$3DROLL
MOV AX,[DI+4]
CMP AX,1
JG DEX_1_2
JMP FAR PTR DEX_OUT
;
DEX_1_2:MOV AX,[DI]
MOV DX,100
IMUL DX
MOV BX,DX
AND BX,BX
JNS DEX122
NEG BX
DEX122: SHL BX,1
SHL BX,1
CMP BX,[DI+4]
JL DEX_1_3
JMP [DEX_OUT]
;
DEX_1_3:MOV BX,[DI+4]
IDIV BX
MOV CX,AX
;
MOV AX,[DI+2]
MOV DX,100
IMUL DX
MOV BX,DX
AND BX,BX
JNS DEX132
NEG BX
DEX132: SHL BX,1
SHL BX,1
CMP BX,[DI+4]
JL DEX_1_4
JMP [DEX_OUT]
;
DEX_1_4:MOV BX,[DI+4]
IDIV BX
MOV DX,AX
;
ADD CX,CENTX
NEG DX
ADD DX,CENTY
;
CMP CX,SCRNX0
JLE DEX_OUT
CMP CX,SCRNX1
JGE DEX_OUT
CMP DX,SCRNY0
JLE DEX_OUT
CMP DX,SCRNY1
JGE DEX_OUT
;
MOV DI,OFFSET DRWBUF
$ADFRM
MOV DI,OFFSET ERSBUF
$ADFRM
;
DEX_OUT:ADD SI,4
MOV AX,[SI]
CMP AX,7FFFH
JE DEX_O_2
JMP [DEX_1]
;
DEX_O_2:ADD SI,2
POP AX
MOV DI,OFFSET Y3WORK
$GCOLOR
MOV DI,OFFSET DRWBUF
$GDRAW
$MKFRM 4000H+3*32+31
INC AX
CMP AX,7
JE DEX_END
PUSH AX
JMP [DEX_0]
;
DEX_END:RET
DRAWEXE ENDP
;
GOFWRD PROC
PUSH AX
PUSH BX
PUSH DX
;
MOV AX,[MSPEED]
MOV BX,[MPICH]
$COS
MOV BX,[MHEAD]
$SIN
SUB [MX],AX
;
MOV AX,[MSPEED]
MOV BX,[MPICH]
$COS
MOV BX,[MHEAD]
$COS
ADD [MZ],AX
;
MOV AX,[MSPEED]
MOV BX,[MPICH]
$SIN
ADD [MY],AX
CMP [MY],LOWEST
JG GF_0
MOV [MY],LOWEST
;
GF_0: CMP [MY],HIGHEST
JL GF_1
MOV [MY],HIGHEST
;
GF_1: POP DX
POP BX
POP AX
RET
GOFWRD ENDP
;
CENTLIN PROC
MOV DI,OFFSET Y3WORK
$PSET
MOV AL,7
$GCOLOR
LINEXE CENTX-10,CENTY ,CENTX-5,CENTY
LINEXE CENTX+10,CENTY ,CENTX+5,CENTY
LINEXE CENTX ,CENTY-8,CENTX ,CENTY-5
LINEXE CENTX ,CENTY+8,CENTX ,CENTY+5
RET
CENTLIN ENDP
;
;
;
RADER PROC
PUSH AX
PUSH CX
PUSH DX
PUSH DI
MOV DI,OFFSET Y3WORK
MOV AL,1
$GCOLOR
LINEXE RDX0+1,(RDY0+RDY1)/2,RDX1-1,(RDY0+RDY1)/2
LINEXE (RDX0+RDX1)/2,RDY0+1,(RDX0+RDX1)/2,RDY1-1
MOV AL,6
$GCOLOR
MOV AX,[MX]
CWD
MOV DI,273
IDIV DI
MOV CX,AX
MOV AX,[MZ]
CWD
MOV DI,-273
IDIV DI
MOV DX,AX
ADD CX,(RDX0+RDX1)/2
ADD DX,(RDY0+RDY1)/2
CMP CX,RDX0
JLE RDR_EX
CMP CX,RDX1
JGE RDR_EX
CMP DX,RDY0
JLE RDR_EX
CMP DX,RDY1
JGE RDR_EX
MOV DI,OFFSET ERSBUF
$ADFRM
MOV DI,OFFSET Y3WORK
$POINT
RDR_EX: POP DI
POP DX
POP CX
POP AX
RET
RADER ENDP
;
;
;
HIGHTM PROC
MOV DI,OFFSET Y3WORK
$PRESET
MOV BX,[HIGHTS]
MOV DX,[HIGHTS]
MOV AX,HIGHTX+10
MOV CX,HIGHTX+19
$LINE
$PSET
MOV AL,2
$GCOLOR
;
MOV DX,[MY]
SUB DX,LOWEST
SHR DX,1
NEG DX
ADD DX,HIGHTY1
CMP DX,HIGHTY0
JGE HIGHTE
MOV DX,HIGHTY0
HIGHTE: MOV [HIGHTS],DX
MOV BX,DX
MOV AX,HIGHTX+10
MOV CX,HIGHTX+19
$LINE
RET
HIGHTM ENDP
;
;
;
POWMTR PROC
MOV DI,OFFSET Y3WORK
MOV SI,[MPOWER]
SUB SI,[POWSTK]
JNE PWMTR0
;
RET
;
PWMTR0: JG PWUP0
PWDWN0: $PRESET
MOV BX,[MPOWER]
INC BX
SHL BX,1
NEG BX
ADD BX,POWY1
MOV DX,BX
PWDWN1: MOV AX,POWX0+1
MOV CX,POWX1-1
PUSH BX
PUSH SI
$LINE
POP SI
POP BX
SUB BX,2
MOV DX,BX
;
INC SI
JNE PWDWN1
MOV AX,[MPOWER]
MOV [POWSTK],AX
RET
POWMTR ENDP
;
PWUP0: $PSET
MOV AL,2
$GCOLOR
MOV BX,[MPOWER]
SHL BX,1
NEG BX
ADD BX,POWY1
MOV DX,BX
PWUP1: MOV AX,POWX0+1
MOV CX,POWX1-1
PUSH BX
PUSH SI
$LINE
POP SI
POP BX
ADD BX,2
MOV DX,BX
DEC SI
JNE PWUP1
MOV AX,[MPOWER]
MOV [POWSTK],AX
RET
;
;
;
POSTURE PROC
MOV DI,OFFSET Y3WORK
;
MOV BX,[MPICH]
AND BX,1023
;
CMP BX,768
JL POST0
SUB BX,1024
JMP POST1
;
POST0: CMP BX,256
JL POST1
SUB BX,512
;
POST1: NEG BX
MOV [DI+2],BX
MOV [DI+6],BX
;
MOV BX,[MBANK]
NEG BX
MOV CX,400
MOV DX,[DI+2]
$ROLL
MOV [DI ],CX
NEG DX
MOV [DI+2],DX
;
MOV BX,[MBANK]
NEG BX
MOV CX,-400
MOV DX,[DI+6]
$ROLL
MOV [DI+4],CX
NEG DX
MOV [DI+6],DX
;
ADD WORD PTR [DI ],POSTCX
ADD WORD PTR [DI+2],POSTCY
ADD WORD PTR [DI+4],POSTCX
ADD WORD PTR [DI+6],POSTCY
;
MOV WORD PTR [DI+10],POSTX0+1
MOV WORD PTR [DI+12],POSTY0+1
MOV WORD PTR [DI+14],POSTX1-1
MOV WORD PTR [DI+16],POSTY1-1
;
CALL [CLIPF]
;
ADD DI,8
$PRESET
MOV AX,[POSTSX0]
MOV BX,[POSTSY0]
MOV CX,[POSTSX1]
MOV DX,[POSTSY1]
$LINE
MOV AL,7
$GCOLOR
$PSET
LINEXE (POSTCX+POSTX0)/2,POSTCY,(POSTCX+POSTX1)/2,POSTCY
SUB DI,8
;
MOV AX,[DI ]
MOV BX,[DI+2]
MOV CX,[DI+4]
MOV DX,[DI+6]
MOV [POSTSX0],AX
MOV [POSTSY0],BX
MOV [POSTSX1],CX
MOV [POSTSY1],DX
$LINE
;
RET
POSTURE ENDP
;
;
;
ILS_HOR PROC
MOV DI,OFFSET Y3WORK
$PRESET
MOV AX,[ILS_HS]
MOV BX,ILSH_Y-1
MOV CX,[ILS_HS]
SUB CX,5
MOV DX,ILSH_Y-6
$LINE
MOV AX,[ILS_HS]
MOV BX,ILSH_Y-1
MOV CX,[ILS_HS]
ADD CX,5
MOV DX,ILSH_Y-6
$LINE
MOV AL,2
$GCOLOR
;
MOV AX,(PORTX0+PORTX1)/2
SUB AX,[MX]
CMP AX,PORTX0*2
JG ILS_H0
MOV AX,PORTX0*2
ILS_H0: CMP AX,PORTX1*2
JL ILS_H1
MOV AX,PORTX1*2
;
ILS_H1: MOV BX,[MZ]
AND BX,BX
JS ILS_H2
NEG AX
ILS_H2: MOV BX,2
IMUL BX
ADD AX,ILSH_X
MOV [ILS_HS],AX
;
$PSET
MOV AX,[ILS_HS]
MOV BX,ILSH_Y-1
MOV CX,[ILS_HS]
SUB CX,5
MOV DX,ILSH_Y-6
$LINE
MOV AX,[ILS_HS]
MOV BX,ILSH_Y-1
MOV CX,[ILS_HS]
ADD CX,5
MOV DX,ILSH_Y-6
$LINE
;
RET
ILS_HOR ENDP
;
;
;
HEADANG PROC
MOV DI,OFFSET Y3WORK
$PRESET
MOV AX,DIRCX
MOV BX,DIRCY
MOV CX,[DIRSX]
MOV DX,[DIRSY]
$LINE
MOV AL,6
$GCOLOR
$PSET
;
MOV BX,[MHEAD]
ADD BX,256
MOV AX,DIRR-5
$COS
MOV CX,AX
MOV BX,[MHEAD]
ADD BX,256
MOV AX,DIRR-5
$SIN
MOV DX,AX
;
ADD CX,DIRCX
NEG DX
ADD DX,DIRCY
MOV [DIRSX],CX
MOV [DIRSY],DX
;
MOV AX,DIRCX
MOV BX,DIRCY
$LINE
RET
HEADANG ENDP
;
;
;
SPEEDM PROC
MOV DI,OFFSET Y3WORK
MOV AL,2
$GCOLOR
CMP WORD PTR [MSPEED],TOSPD
JL SPDM2
MOV AL,6
$GCOLOR
SPDM2: $PRESET
MOV AX,SPDX0+1
MOV BX,[SPDS]
MOV CX,SPDX1-1
MOV DX,[SPDS]
$LINE
$PSET
MOV AX,SPDX0+1
MOV CX,SPDX1-1
MOV BX,SPDY1-1
SUB BX,[MSPEED]
MOV DX,BX
MOV [SPDS],BX
$LINE
RET
SPEEDM ENDP
;
;
;
RADDER PROC
MOV BX,[MBANK]
AND BX,1023
JNE RAD0
RET
;
RAD0:
; -6<BX<6 not care
CMP BX,1018 ;1018 = -6
JGE RAD_EX
CMP BX,6
JLE RAD_EX
; 506<BX<518 not care
CMP BX,506
JL RAD1
CMP BX,518
JLE RAD_EX
;
RAD1:
MOV AX,RADSPC
$SIN
ADD [MHEAD],AX
;
RAD_EX:
RET
RADDER ENDP
;
;
;
PULLUP PROC
MOV AX,ELVSPC
MOV BX,[MBANK]
$COS
ADD [MPICH],AX
MOV AX,ELVSPC
MOV BX,[MBANK]
$SIN
ADD [MHEAD],AX
; 256<MPICH<768 must be corrected
AND [MPICH],1023
CMP [MPICH],256
JL PLUP_EX
CMP [MPICH],768
JG PLUP_EX
;
SUB [MPICH],512
NEG [MPICH]
AND [MPICH],1023
ADD [MBANK],512
AND [MBANK],1023
PLUP_EX:
RET
PULLUP ENDP
;
PULLDWN PROC
MOV AX,ELVSPC
MOV BX,[MBANK]
$COS
SUB [MPICH],AX
MOV AX,ELVSPC
MOV BX,[MBANK]
$SIN
SUB [MHEAD],AX
; 256<MPICH<768 must be corrected
AND [MPICH],1023
CMP [MPICH],256
JL PLDN_EX
CMP [MPICH],768
JG PLDN_EX
;
SUB [MPICH],512
NEG [MPICH]
AND [MPICH],1023
ADD [MBANK],512
AND [MBANK],1023
PLDN_EX:
RET
PULLDWN ENDP
;
KEYSCAN PROC
MOV DI,OFFSET Y3WORK
$K_READ
;
$K_CHK 4FH ;←
JE KS_2
MOV AX,[CCODE]
AND AX,LANDING
JNE KS_1L
ADD [MBANK],AILSPC
JMP KS_2
KS_1L: ADD [MHEAD],AILSPC
KS_2: $K_CHK 51H ;→
JE KS_3
MOV AX,[CCODE]
AND AX,LANDING
JNE KS_2L
SUB [MBANK],AILSPC
JMP KS_3
KS_2L: SUB [MHEAD],AILSPC
KS_3: $K_CHK 4DH
JE KS_4
CALL [PULLDWN]
KS_4: $K_CHK 50H
JE KS_7
CALL [PULLUP]
KS_7: $K_CHK 11H
JE KS_8
ADD [MPOWER],DPOW
CMP [MPOWER],POWMAX
JL KS_8
MOV [MPOWER],POWMAX
KS_8: $K_CHK 1EH
JE KS_9
SUB [MPOWER],DPOW
JNS KS_9
MOV [MPOWER],0
KS_9: $K_CHK 01H
JE KS_10
MOV AH,4CH
INT 21H
KS_10: $K_BUFC
RET
KEYSCAN ENDP
;
;
;
POWSPD PROC
MOV AX,[MPOWER]
CMP AX,20
JG PS1
SUB WORD PTR [MSPEED],DSPD
JMP PSX
;
PS1: CMP AX,40
JG PS2
JMP PSX
;
PS2: CMP AX,45
JG PS3
ADD WORD PTR [MSPEED],DSPD
JMP PSX
;
PS3: CMP AX,50
JG PS4
ADD WORD PTR [MSPEED],DSPD*2
JMP PSX
;
PS4: ADD WORD PTR [MSPEED],DSPD*3
;
PSX: CMP WORD PTR [MSPEED],0
JG PSY
MOV WORD PTR [MSPEED],0
;
PSY: CMP WORD PTR [MSPEED],FASTEST
JL C_LAND
MOV WORD PTR [MSPEED],FASTEST
POWSPD ENDP
;
;
;
CONDITN PROC
C_LAND: MOV AX,[CCODE]
AND AX,LANDING
JNE C_LAN0
JMP C_PRUN
;
C_LAN0: CMP [MY],LOWEST+LBOUND
JLE C_LN01
JMP C_PRUN
;
C_LN01: MOV [MY],LOWEST
MOV AX,[MSPEED]
AND AX,AX
JNE C_LAN1
;
MOV WORD PTR [CCODE],ABOUT
RET
;
;
C_LAN1: CMP WORD PTR [MSPEED],TDSPD
JG C_LAN2
SUB WORD PTR [MPICH],4
C_LAN2: CMP WORD PTR [MPICH],0
JG C_LAN3
MOV WORD PTR [MPICH],0
C_LAN3: MOV WORD PTR [MBANK],0
;
CMP WORD PTR [MX],PORTX0
JL C_LOUT
CMP WORD PTR [MX],PORTX1
JG C_LOUT
CMP WORD PTR [MZ],PORTZ0
JL C_LOUT
CMP WORD PTR [MZ],PORTZ1
JG C_LOUT
RET
;
C_LOUT: OR WORD PTR [CCODE],ABOUT
OR WORD PTR [CCODE],COUT
RET
;
;
C_PRUN: MOV AX,[CCODE]
AND AX,TAKEOFF
JE C_PR0
JMP C_FLT
;
C_PR0: CMP [MY],LOWEST
JG C_PR2
;
JMP C_LAN1 ;COURSE OUT CHECK
;
C_PR2: CMP WORD PTR [MSPEED],TOSPD
JL C_LOW
OR WORD PTR [CCODE],TAKEOFF
MOV AX,NOT LANDING
AND WORD PTR [CCODE],AX
RET
;
C_LOW: OR WORD PTR [CCODE],ABOUT
OR WORD PTR [CCODE],LOWSPD
RET
;
C_FLT: CMP WORD PTR [MY],LOWEST
JG C_FLT1
CMP WORD PTR [MPICH],0
JL C_CRSH
OR WORD PTR [CCODE],LANDING
MOV AX,NOT TAKEOFF
AND WORD PTR [CCODE],AX
RET
;
C_CRSH: OR WORD PTR [CCODE],ABOUT
OR WORD PTR [CCODE],BADPICH
RET
;
;
C_FLT1: CMP WORD PTR [MSPEED],SLOWEST
JG C_FLT2
OR [CCODE],ABOUT
OR [CCODE],LOWSPD
RET
;
C_FLT2: CMP [MSPEED],DWNSPD
JG C_FLT3
SUB [MY],3
JG C_FLT3
MOV [MY],LOWEST
C_FLT3: RET
;
RET
CONDITN ENDP
;
;
;
WAITR PROC
MOV DI,OFFSET Y3WORK
WAITR0: $K_READ
$K_CHK 1DH
JE WAITR0
RET
WAITR ENDP
;
;
;
ENTRY PROC
MOV AX,DATA
MOV DS,AX
;
MOV AH,02H
MOV DL,12
INT 21H
;
INITALL:MOV DI,OFFSET Y3WORK
$C_INIT
$GBINIT
$GCLS
$K_INIT
$C_COFF
$K_COFF
;
CALL [MAKEDSP]
; INITIALIZE
MOV WORD PTR [POWSTK],0
MOV WORD PTR [MPOWER],0
MOV WORD PTR [MSPEED],0
MOV WORD PTR [ILS_HS],ILSH_X
MOV WORD PTR [DIRSX],DIRCX
MOV WORD PTR [DIRSY],DIRCY
MOV WORD PTR [SPDS],SPDY1-1
MOV WORD PTR [CCODE],0
MOV WORD PTR [MX],0
MOV WORD PTR [MZ],-750
MOV WORD PTR [MY],LOWEST
MOV WORD PTR [MHEAD],0
MOV WORD PTR [MPICH],0
MOV WORD PTR [MBANK],0
CALL [DRAWEXE]
;
$LOCATE 40-SIZ_HR/2,7
MOV DI,OFFSET MES_HR
MOV CX,SIZ_HR
$PRINT
$LOCATE 40-SIZ_YM/2,5
MOV DI,OFFSET MES_YM
MOV CX,SIZ_YM
$PRINT
CALL [WAITR]
$C_CLS
;
MLOOP: CMP WORD PTR [MY],LOWEST
JGE MLP2
MOV WORD PTR [MY],LOWEST
MLP2: CALL [DRAWEXE]
;
CALL [KEYSCAN]
;
CALL [RADER]
CALL [POWMTR]
;
CALL [KEYSCAN]
;
CALL [POSTURE]
CALL [HIGHTM]
CALL [ILS_HOR]
CALL [HEADANG]
;
CALL [KEYSCAN]
;
CALL [SPEEDM]
CALL [RADDER]
CALL [GOFWRD]
CALL [CONDITN]
;
INC WORD PTR [PCTR]
MOV AX,[PCTR]
AND AX,3
JNE PSCHK
CALL [POWSPD]
PSCHK: CALL [KEYSCAN]
;
MOV AX,[CCODE]
AND AX,ABOUT
JNE MLOUT
;
MOV DI,OFFSET Y3WORK
$PRESET
MOV DI,OFFSET ERSBUF
$GDRAW
MOV DI,OFFSET Y3WORK
CALL [CENTLIN]
;
JMP [MLOOP]
;
MLOUT: MOV AX,[CCODE]
AND AX,LOWSPD
JE MLOUT2
$LOCATE 40-SIZ_LS/2,8
MOV DI,OFFSET MES_LS
MOV CX,SIZ_LS
$PRINT
CALL [WAITR]
JMP [INITALL]
MLOUT2: MOV AX,[CCODE]
AND AX,HISPD
JE MLOUT3
$LOCATE 40-SIZ_HS/2,8
MOV DI,OFFSET MES_HS
MOV CX,SIZ_HS
$PRINT
CALL [WAITR]
JMP [INITALL]
MLOUT3: MOV AX,[CCODE]
AND AX,BADPICH
JE MLOUT4
$LOCATE 40-SIZ_BP/2,8
MOV DI,OFFSET MES_BP
MOV CX,SIZ_BP
$PRINT
CALL [WAITR]
JMP [INITALL]
MLOUT4: MOV AX,[CCODE]
AND AX,COUT
JE MLOUT5
$LOCATE 40-SIZ_CO/2,8
MOV DI,OFFSET MES_CO
MOV CX,SIZ_CO
$PRINT
CALL [WAITR]
JMP [INITALL]
MLOUT5: $LOCATE 40-SIZ_SF/2,8
MOV DI,OFFSET MES_SF
MOV CX,SIZ_SF
$PRINT
CALL [WAITR]
JMP [INITALL]
;
;
ENTRY ENDP
;
;
CODE ENDS
;
;
;
STACK SEGMENT STACK
DW 2048 DUP(?)
STACK ENDS
;
END ENTRY